Ajan jakaminen vuosiin ja kuukausiin¶

Huomasin joidenkin mallien tarvivan erillistä vuosi tai kuukausi saraketta, joten tässä se luodaan.

In [1]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import plotly.io as pio
pio.renderers.default='notebook'
url_src = "data/LBNL_file.csv"
df = pd.read_csv(url_src, low_memory=False, parse_dates=True)
df_a = df[['state','city','zip_code','customer_segment','total_installed_price','third_party_owned','self_installed',
           'system_size_DC','efficiency_module_1','efficiency_module_2','efficiency_module_3','installation_date']]
df_a = df_a.replace(-9999,np.nan)
df_a[['efficiency_module_1','efficiency_module_2','efficiency_module_3']] = df_a[['efficiency_module_1','efficiency_module_2',
                                                                                 'efficiency_module_3']].fillna(0)
df_a['city'] = df_a['city'].str.upper()
# ER arvo (valinnainen)
# Luodaan moduuli laskuri
df_a.loc[df_a['efficiency_module_1'].copy() > 0,'modules'] = 1
df_a.loc[df_a['efficiency_module_2'] > 0,'modules'] += 1
df_a.loc[df_a['efficiency_module_3'] > 0,'modules'] += 1
df_a['ER'] = (df_a['efficiency_module_1']+df_a['efficiency_module_2']+df_a['efficiency_module_3'])/df_a['modules']
In [2]:
print('NaN Module:',len(df_a.loc[df_a['modules'].isna()]))
print('1 Module:',len(df_a.loc[df_a['modules'] == 1]))
print('2 Modules:',len(df_a.loc[df_a['modules'] == 2]))
print('3 Modules:',len(df_a.loc[df_a['modules'] == 3]))
NaN Module: 94297
1 Module: 898202
2 Modules: 6353
3 Modules: 1148
In [3]:
# Jätetään moduliton data pois
df_a['modules'] = df_a['modules'].fillna(0)
df_a = df_a.loc[df_a['modules'] != 0]
df_a = df_a.loc[df_a['total_installed_price'] != 0]
df_a = df_a.loc[df_a['total_installed_price'] < 60000000]
df_a = df_a.loc[df_a['system_size_DC'] != 0]
df_a = df_a.loc[df_a['self_installed'] == 0]
df_a = df_a.loc[df_a['third_party_owned'] == 0]
# Otetaan vaan Kalifornia
df_a = df_a.loc[df_a['state'] == 'CA']

df_a['installation_date'] = pd.to_datetime(df_a['installation_date'])
df_a = df_a.sort_values(by='installation_date')
# Luodaan vuodet
df_a['year'] = df_a['installation_date'].dt.year
# Luodaan kuukaudet
df_a['month'] = df_a['installation_date'].dt.month
In [4]:
# Testit
print('Years',df_a['year'].unique())
print('Months',df_a['month'].unique())
print('Years',len(df_a['year'].unique()))
print('Months',len(df_a['month'].unique()))
Years [2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014
 2015 2016 2017 2018 2019]
Months [12  5  6  7  8  9 10 11  1  2  3  4]
Years 19
Months 12
In [5]:
print(df_a[['year','month']].describe(datetime_is_numeric=True))
                year          month
count  440512.000000  440512.000000
mean     2016.243796       6.936211
std         2.873585       3.456747
min      2001.000000       1.000000
25%      2015.000000       4.000000
50%      2017.000000       7.000000
75%      2018.000000      10.000000
max      2019.000000      12.000000
In [6]:
# Muutetaan stringeiksi niin saadaan esiintymät
df_a['year'] = df_a['year'].astype(str)
df_a['month'] = df_a['month'].astype(str)
print(df_a[['year','month']].describe(datetime_is_numeric=True))
          year   month
count   440512  440512
unique      19      12
top       2019      12
freq     92838   47001

Pieniä havaintoja ja pohdintoja¶

  • 2016 vuonna näyttää tapahtuneen eniten asennuksia vuosista.
  • Joulukuussa on tehty eniten asennuksia.
  • Vuodet 1999 ja 2000 jääneet pois kokonaan.
    • Päätelmä niiltä ei ole kerätty hyötysuhde dataa.
    • Kommentoin NaN arvojen poiston ja testaan mitä sanoo.
  • Kun NaN arvot mukana kaikki vuodet tulevat mukaan.
  • Alku vuosien dataa ei voi käyttää hyötysuhdetta kuvaavissa kaavioissa.
  • Tämä voi myös vaikuttaa kokoon ja hintaan jos ajatellaan tehokkaamman yksikön hyötysuhteeltaan olevan kalliiman.
  • Ensimmäisiltä vuosiltä on muutenkin dataa aika vähän eikä ole tiedossa onko tarvinnut korjailuita tai onko vaihdettu uudempiin.
  • Henkilö kohtaisesti suosittelen käyttämän dataa siellä missä sitä on saatavilla.
  • Syytä myös muistaa kuvaajien olevan muille kuin itselle eli niistä on saatava hyvin kuvaavia ja riittävän informatiivisia.
  • Keskiarvo tässä tapauksessa vääristää tuloksia kun datan on hyvin hajanaista eikä ainoastaan puutteiden vuoksi vaan myös esim. asiakaskuntien ja alueiden välillä on suuria eroja.
  • Valta osa datasta tulee Kaliforniasta joten aijon seuraavaksi jättää muut pois laskuista.

Seuraavissa testeissä vaan Kalifornian dataa¶

  • Jätän myös 4 ensimmäistä vuotta pois koska niissä on paljon puutteita datassa
In [7]:
# Alku vuodet pois
df_a['year'] = df_a['year'].astype(int)
df_a['month'] = df_a['month'].astype(int)
df_a = df_a.loc[df_a['year'] > 2001]
print('Years',df_a['year'].unique())
print('Years',len(df_a['year'].unique()))
Years [2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
 2016 2017 2018 2019]
Years 18

Koska vuosia on 18 voidaan data jakaa vielä 2 osaan ainakin testimielessä.

In [8]:
# x arvo kuvaa moduulien määrää
cols = ['city', 'zip_code', 'customer_segment', 'total_installed_price', 'system_size_DC', 
        'installation_date', 'modules', 'ER', 'year', 'month']
df_f = df_a[cols].loc[df_a['year'] < 2011]
df_l = df_a[cols].loc[df_a['year'] > 2010]
df_f = df_f.dropna()
df_f.describe(include='all',datetime_is_numeric=True)
Out[8]:
city zip_code customer_segment total_installed_price system_size_DC installation_date modules ER year month
count 31642 31642 31642 3.164200e+04 31642.000000 31642 31642.000000 31642.000000 31642.000000 31642.000000
unique 870 1271 5 NaN NaN NaN NaN NaN NaN NaN
top SAN FRANCISCO 95472 RES NaN NaN NaN NaN NaN NaN NaN
freq 1299 370 30641 NaN NaN NaN NaN NaN NaN NaN
mean NaN NaN NaN 5.617922e+04 7.843031 2008-12-25 21:38:36.187345920 1.021048 0.147007 2008.472631 6.676411
min NaN NaN NaN 2.836860e+03 0.330000 2002-05-17 00:00:00 1.000000 0.054687 2002.000000 1.000000
25% NaN NaN NaN 2.408020e+04 3.060000 2008-02-14 00:00:00 1.000000 0.132502 2008.000000 4.000000
50% NaN NaN NaN 3.420000e+04 4.600000 2009-04-11 00:00:00 1.000000 0.140693 2009.000000 7.000000
75% NaN NaN NaN 4.875857e+04 6.750000 2010-03-07 00:00:00 1.000000 0.168799 2010.000000 10.000000
max NaN NaN NaN 1.202354e+07 1308.320000 2010-12-31 00:00:00 3.000000 0.195007 2010.000000 12.000000
std NaN NaN NaN 2.453749e+05 37.182728 NaN 0.153752 0.021007 1.516247 3.428095
In [9]:
df_l = df_l.dropna()
df_l.describe(include='all',datetime_is_numeric=True)
Out[9]:
city zip_code customer_segment total_installed_price system_size_DC installation_date modules ER year month
count 408857 408857 408857 4.088570e+05 408857.000000 408857 408857.000000 408857.000000 408857.000000 408857.000000
unique 1140 1556 5 NaN NaN NaN NaN NaN NaN NaN
top SAN DIEGO 95762 RES NaN NaN NaN NaN NaN NaN NaN
freq 25883 3699 396434 NaN NaN NaN NaN NaN NaN NaN
mean NaN NaN NaN 3.829385e+04 10.100550 2017-05-19 12:19:50.053245952 1.006814 0.184177 2016.845379 6.956334
min NaN NaN NaN 1.000000e-02 0.026400 2011-01-01 00:00:00 1.000000 0.058182 2011.000000 1.000000
25% NaN NaN NaN 1.742900e+04 4.160000 2016-04-12 00:00:00 1.000000 0.169643 2016.000000 4.000000
50% NaN NaN NaN 2.450000e+04 5.886000 2017-08-17 00:00:00 1.000000 0.184490 2017.000000 7.000000
75% NaN NaN NaN 3.367400e+04 8.125000 2018-11-23 00:00:00 1.000000 0.200157 2018.000000 10.000000
max NaN NaN NaN 2.000000e+07 4445.280000 2019-12-31 00:00:00 3.000000 0.227273 2019.000000 12.000000
std NaN NaN NaN 1.665082e+05 45.444583 NaN 0.093300 0.019412 1.918578 3.458149
In [10]:
print('Asennusten määrän kertautuminen ensimmäiseltä puoliskolta jälkimmäiselle n.',round(df_l['city'].count()/df_f['city'].count()))
print('Max hinnan kertautuminen ensimmäiseltä puoliskolta jälkimmäiselle n.',round(df_l['total_installed_price'].max()/df_f['total_installed_price'].max()))
Asennusten määrän kertautuminen ensimmäiseltä puoliskolta jälkimmäiselle n. 13
Max hinnan kertautuminen ensimmäiseltä puoliskolta jälkimmäiselle n. 2

Havaintoja ja pohdintaa¶

  • Asennusten määrä on yli 17 kertaistunut jälkimmäisellä puoliskolla verrattuna ensimmäiseen.
  • Tämä ei tietenkään kerro kaikke esim. kokoja ei ole otettu huomioon.
  • Tosin myös hyötysuhteet ovat kasvaneet, jolloin ei ole välttämättä tarvetta niin isoille yksiköille.
  • Hinta on myös jäänyt huomioimatta, mutta siihenkin on voinut vaikuttaa teknologian kehitys.(onko se lopulta nostanut vai laskenut hintoja? Esim. uuden iPhone malin hinnan nousut...)
  • Koon kasvusta ja hinnan noususta ei voi tehdä kovin suuria päätelmiä kun yksittäinen suuri hankinta saattaa muuttaa kuviota.
  • Tietenkään yleisen kasvun osuutta ei voi kiistää niin määrässä, koossa ja hinnassa.

Väärien arvojen poistoa¶

  • Hinnoissa ja koissa saattaa olla vielä epäselvyyksiä, joten tutkitaan hiukan niitä.
  • Poistetaan myös turhia sarakkeita(tehtiinkin jo aiemmassa solussa).
In [11]:
res_f = df_f.loc[df_f['customer_segment']=='RES']
res_f = res_f.drop(['customer_segment'], axis=1)
res_f.describe(include='all',datetime_is_numeric=True)
Out[11]:
city zip_code total_installed_price system_size_DC installation_date modules ER year month
count 30641 30641 3.064100e+04 30641.000000 30641 30641.000000 30641.000000 30641.000000 30641.000000
unique 857 1247 NaN NaN NaN NaN NaN NaN NaN
top SAN FRANCISCO 95472 NaN NaN NaN NaN NaN NaN NaN
freq 1258 357 NaN NaN NaN NaN NaN NaN NaN
mean NaN NaN 4.078810e+04 5.494559 2008-12-20 20:10:28.334584320 1.019810 0.147160 2008.459091 6.672596
min NaN NaN 2.836860e+03 0.330000 2002-05-17 00:00:00 1.000000 0.054687 2002.000000 1.000000
25% NaN NaN 2.388392e+04 3.040000 2008-02-07 00:00:00 1.000000 0.132502 2008.000000 4.000000
50% NaN NaN 3.364800e+04 4.510000 2009-04-09 00:00:00 1.000000 0.140802 2009.000000 7.000000
75% NaN NaN 4.733100e+04 6.450000 2010-03-05 00:00:00 1.000000 0.168799 2010.000000 10.000000
max NaN NaN 2.234244e+06 361.900000 2010-12-31 00:00:00 3.000000 0.195007 2010.000000 12.000000
std NaN NaN 3.676248e+04 4.898067 NaN 0.149081 0.020953 1.522921 3.423090
In [12]:
com_f = df_f.loc[df_f['customer_segment']=='COM']
com_f = com_f.drop(['customer_segment'], axis=1)
com_f.describe(include='all',datetime_is_numeric=True)
Out[12]:
city zip_code total_installed_price system_size_DC installation_date modules ER year month
count 708 708 7.080000e+02 708.000000 708 708.000000 708.000000 708.000000 708.000000
unique 273 368 NaN NaN NaN NaN NaN NaN NaN
top SAN FRANCISCO 95448 NaN NaN NaN NaN NaN NaN NaN
freq 28 13 NaN NaN NaN NaN NaN NaN NaN
mean NaN NaN 4.862635e+05 78.515132 2009-05-07 19:45:45.762711808 1.038136 0.141814 2008.853107 6.484463
min NaN NaN 8.171000e+03 1.170000 2002-07-05 00:00:00 1.000000 0.060306 2002.000000 1.000000
25% NaN NaN 4.954597e+04 6.907500 2008-10-11 00:00:00 1.000000 0.132502 2008.000000 3.000000
50% NaN NaN 1.044572e+05 14.400000 2009-05-18 12:00:00 1.000000 0.137410 2009.000000 6.500000
75% NaN NaN 3.176611e+05 49.140000 2010-05-08 06:00:00 1.000000 0.144158 2010.000000 10.000000
max NaN NaN 9.480240e+06 1308.320000 2010-12-30 00:00:00 2.000000 0.195007 2010.000000 12.000000
std NaN NaN 1.106905e+06 187.805001 NaN 0.191659 0.019655 1.296674 3.639876
In [13]:
res_l = df_l.loc[df_l['customer_segment']=='RES']
res_l = res_l.drop(['customer_segment'], axis=1)
res_l.describe(include='all',datetime_is_numeric=True)
Out[13]:
city zip_code total_installed_price system_size_DC installation_date modules ER year month
count 396434 396434 3.964340e+05 396434.000000 396434 396434.000000 396434.000000 396434.000000 396434.000000
unique 1123 1527 NaN NaN NaN NaN NaN NaN NaN
top SAN DIEGO 95762 NaN NaN NaN NaN NaN NaN NaN
freq 25347 3684 NaN NaN NaN NaN NaN NaN NaN
mean NaN NaN 2.702739e+04 6.489967 2017-05-24 07:45:07.596220416 1.006188 0.184480 2016.857681 6.966923
min NaN NaN 1.000000e-02 0.042900 2011-01-01 00:00:00 1.000000 0.058182 2011.000000 1.000000
25% NaN NaN 1.724476e+04 4.140000 2016-04-13 00:00:00 1.000000 0.169643 2016.000000 4.000000
50% NaN NaN 2.415500e+04 5.800000 2017-08-21 00:00:00 1.000000 0.184875 2017.000000 7.000000
75% NaN NaN 3.282500e+04 7.920000 2018-11-27 00:00:00 1.000000 0.200157 2018.000000 10.000000
max NaN NaN 3.129000e+06 1097.555000 2019-12-31 00:00:00 3.000000 0.227273 2019.000000 12.000000
std NaN NaN 2.629454e+04 6.159109 NaN 0.089222 0.019315 1.908300 3.455900
In [14]:
com_l = df_l.loc[df_l['customer_segment']=='COM']
com_l = com_l.drop(['customer_segment'], axis=1)
com_l.describe(include='all',datetime_is_numeric=True)
Out[14]:
city zip_code total_installed_price system_size_DC installation_date modules ER year month
count 9844 9844 9.844000e+03 9844.000000 9844 9844.000000 9844.000000 9844.000000 9844.000000
unique 702 1070 NaN NaN NaN NaN NaN NaN NaN
top SAN DIEGO 91387 NaN NaN NaN NaN NaN NaN NaN
freq 508 97 NaN NaN NaN NaN NaN NaN NaN
mean NaN NaN 3.146384e+05 115.934929 2017-03-20 13:11:49.467696128 1.021638 0.175225 2016.711195 6.589395
min NaN NaN 1.000000e-02 0.026400 2011-01-01 00:00:00 1.000000 0.058182 2011.000000 1.000000
25% NaN NaN 4.134000e+04 12.036250 2016-05-06 00:00:00 1.000000 0.163051 2016.000000 4.000000
50% NaN NaN 9.722950e+04 29.700000 2017-06-27 00:00:00 1.000000 0.171305 2017.000000 6.000000
75% NaN NaN 2.775502e+05 97.029075 2018-09-07 06:00:00 1.000000 0.190722 2018.000000 10.000000
max NaN NaN 2.000000e+07 2894.100000 2019-12-31 00:00:00 3.000000 0.226994 2019.000000 12.000000
std NaN NaN 7.125914e+05 226.841639 NaN 0.162648 0.019244 1.992160 3.491857

Havaintoja ja pohdintaa¶

  • COM ja RES hyötysuhteissa ei näy selkeää eroa.
  • Hyötysyhde ero näkyy paremmin ajallisessa kehityksessä
  • Maksimi koossa näkyy eroa COM ja RES välillä.
  • Minimi koot niin pieniä, etten vielä osaa sanoa niistä. Vaikuttaa kuitenkin, etteivät ole virheellisiä arvoja. Todennäköisesti kuseessä on joidenkin laitteiden omia yksiköitä, jotka syystä tai toisesta on kirjattu ylös.
  • Hintaa pitää vielä tutkia. #### Huom! Jatkan tätä vielä kuvaajiksi
  • Toistaiseks nää on tarkoitettu enemmän omaan tutkimukseen ja kokeiluun. Tarkoitus pistää asioita vielä kartalle.
In [15]:
import plotly.express as px
sc_f = df_f
fig = px.scatter_3d(df_f, x='total_installed_price', y='system_size_DC', z='month',animation_group="modules",
              color='ER', animation_frame='year', opacity=0.5, hover_name='city',width=1000, height=1000,
               range_color=[0,0.25],
                range_x=[0,df_f['total_installed_price'].max()], range_y=[0,df_f['system_size_DC'].max()], 
                range_z=[1,12],
               title='Data 2002-2011 all customers')
fig.show()
In [16]:
fig = px.scatter_3d(res_f, x='total_installed_price', y='system_size_DC', z='month',animation_group="modules",
              color='ER', animation_frame='year', opacity=0.5, hover_name='city',width=1000, height=1000,
               range_color=[0,0.25],
               range_x=[0,res_f['total_installed_price'].max()], range_y=[0,res_f['system_size_DC'].max()], 
                range_z=[1,12],
               title='Data 2002-2011 RES customers')
fig.show()
In [17]:
fig = px.scatter_3d(com_f, x='total_installed_price', y='system_size_DC', z='month',animation_group="modules",
              color='ER', animation_frame='year', opacity=0.5, hover_name='city',width=1000, height=1000,
               range_color=[0,0.25],
               range_x=[0,com_f['total_installed_price'].max()], range_y=[0,com_f['system_size_DC'].max()], 
                range_z=[1,12],
               title='Data 2002-2011 COM customers')
fig.show()
In [18]:
fig = px.scatter_3d(df_l, x='total_installed_price', y='system_size_DC', z='month',animation_group="modules",
              color='ER', animation_frame='year', opacity=0.5, hover_name='city',width=1000, height=1000,
               range_color=[0,0.25],
               range_x=[0,df_l['total_installed_price'].max()], range_y=[0,df_l['system_size_DC'].max()], 
                range_z=[1,12],
               title='Data 2011-2020 all customers')
fig.show()
In [19]:
fig = px.scatter_3d(res_l, x='total_installed_price', y='system_size_DC', z='month',animation_group="modules",
              color='ER', animation_frame='year', opacity=0.5, hover_name='city',width=1000, height=1000,
               range_color=[0,0.25],
               range_x=[0,res_l['total_installed_price'].max()], range_y=[0,res_l['system_size_DC'].max()],
               title='Data 2011-2020 RES customers')
fig.show()
In [20]:
fig = px.scatter_3d(com_l, x='total_installed_price', y='system_size_DC', z='month',animation_group="modules",
              color='ER', animation_frame='year', opacity=0.5, hover_name='city',width=1000, height=1000,
               range_color=[0,0.25],
               range_x=[0,com_l['total_installed_price'].max()], range_y=[0,com_l['system_size_DC'].max()], 
                range_z=[1,12],
               title='Data 2011-2020 COM customers')
fig.show()

Havaintoja ja pohdintaa¶

  • Olisiko hinnalle hyvä laittaa katto tai jakaa halvempiin ja kalliisiin.
  • Kalliita huomattavasti vähemmän, ehkä järkevät hinta katot voisivat poistaa joitain outliner:eitä.
  • Miten hajanaisessa datassa määritellään outliner.
  • Kuukausien välinen ero hyvin marginaalinen asennus määrissä.
In [ ]: